package gra;
import java.util.Random;

import GUI.Controler;

/**
 * Klasa Bota komputerowego.
 * Zadania: wybor kart do wymiany.
 */
public class Bot extends Player
{
    /**
     * Konstruktor klasy
     * @param nazwa bota 
     */
    public int AI =0; //domysla taktyka losowa
	public Bot(String nazwa) //Konstruktor klasy.
	{
		super(nazwa);//Dodanie nazwy.
		selectAI();
		this.nazwa+="("+AI+")";
	}
	
	/**
	 * Wybiera losowe AI Bota
	 */
	private void selectAI() 
	{
	    Random generator = new Random();
	    int wybor =  generator.nextInt(100); //Wybiera jedna z 2 taktyk
	    if(wybor<10) AI=1;
	    else AI = 0;
    }

    /**
	 * Metoda implementujaca mozliwosc wymiany kart dla bota.
	 * 
	 * @see gra.Player#operacja(int, gra.Card[])
	 */
	public int[] operacja( int rank, Card[] hand )
    {
	    Random generator = new Random();
	    int war   = generator.nextInt(5);//Wybor losowej ilosci kart do oddania.
	    int[] tab = new int[war];
	    int k     = 0;
	    
        for( int i = 0; i < war; i++ ) //Wybor losowych kart do oddania.
        {
            boolean warunek = true;
            
            while( warunek )
            {
                int j = generator.nextInt(5);
                try
                {
                    if( hand[j] != null )//Sprawdzenie czy nie wyrzucono juz danej karty.
                    {
                        hand[j] = null;//Wyrzucenie karty.
                        warunek = false;
                        tab[k]  = j;
                        k++;
                    }
                }
                catch(ArrayIndexOutOfBoundsException e)
                {
                    System.out.println("Wyjscie poza zarkes tablicy.");
                }
            }
        }
        
        return tab;
    }
	
	public boolean czyBot()
	{
	    return true;
	}
	
	public int licytuj()
	{
	    return 0;
	}
	/**
	 * Operacja licytacji bota
	 * @param jackpot Aktualna pola nagrod
	 * @param MaxBet Aktualny maksymalny zaklad w grze.
	 * @param cash Stan konta gracza
	 * @param opcje[] Opcje jakie ma dostepne bot w grze
	 */
	public int[] bid(int jackpot,int MaxBet,int cash,boolean opcje[],int lastBet,int rank, Licytator licytator )
    {
        if(this.AI==1)
            return JennaAI(jackpot,MaxBet,cash,opcje, lastBet,rank);
        else
            return MartinAI(jackpot,MaxBet,cash,opcje,lastBet,rank);
    }
	
	/**
     * Bot podejmujacy ryzykowne decyzje
     */
	private int[] JennaAI(int jackpot,int MaxBet,int cash,boolean opcje[],int lastBet,int rank)
	{
	    int dane[] = new int[2]; //Dane
	    dane[1] = 0;
	    int i=-1;
        int war=0;
        Random generator = new Random();
        //ALGORYTM AI
        int g2 =  generator.nextInt(4);
        if(opcje[1]) //Operacja Bet
        {
            if(g2>=2)
            {
                if(cash>5) war =5;
                else war=1;
            }
            else
            {
                g2 =  generator.nextInt(cash);
                war = g2;
            }
            dane[0] = 1;
            dane[1] = war;
            return dane;
        }
        if(opcje[2])//Operacja Raise
        {
            int k =0;
            if(lastBet==0)
            {
                k = cash-MaxBet;
                war =  generator.nextInt(k);
            }
            else
            {
                if(rank>=1 && rank>5)
                    war=cash;
                else if(rank==6 && rank==7)
                {
                   if(cash>5)  war = 4;
                   if(cash>10) war = 8;
                   if(cash>20) war = 10;
                   if(cash>30) war = 15;
                }
                else
                  war = 1;
            }
            dane[0] = 2;
            dane[1] = war;
            return dane;
        }
        if(opcje[3])//Operacja Call
        {
            dane[0] = 3;
            return dane;
        }
        if(opcje[5])//Operacja All-IN
        {
            dane[0] = 5;
            return dane;
        }
	    dane[0] = 4;
        return dane;
	}
	
	/**
	 * Losowy podejmujacy losowe decyzje ograniczone mozliwosciami ruchu
	 */
	private int[] MartinAI(int jackpot,int MaxBet,int cash,boolean opcje[],int lastBet,int rank)
	{
	    int i=-1;
        int war=0;
        Random generator = new Random();
        boolean warunek = true;
        int dane[] = new int[2]; //Dane
        while(warunek)
        {
            i = generator.nextInt(6);
            if(opcje[i])
            {
                int k=cash;
                if(i==2)
                {
                    if(lastBet==0)
                        k = cash-MaxBet;
                }
                war = generator.nextInt(k) + 1;
                warunek=false;
            }
        }
        dane[0] = i;
        dane[1] = war;
        return dane;
	}
	
}